package com.yyge;

import com.google.common.collect.HashMultiset;
import com.google.common.collect.Multiset;
import lombok.extern.slf4j.Slf4j;

import java.util.Arrays;
import java.util.List;
import java.util.logging.Logger;

/**
 *  简单理解：具有快速统计的ArrayList
 *  Multiset 是 guava 包下一种新的集合，可以方便的统计集合中重复元素出现的次数。
 *  HashMultiset:：元素存放于 HashMap
 *  LinkedHashMap：即元素的排列顺序由第一次放入的顺序决定，对应LinkedHashMap
 *  TreeMultiset：元素被排序存放于TreeMap
 *  EnumMultiset:：元素必须是 enum 类型
 *  ImmutableMultiset： 不可修改的 Mutiset，对应ImmutableMap
 */
public class MultisetTest {
    public static void main(String[] args) {
        List<String> words = Arrays.asList("张三", "李四", "张三", "王五", "张三", "李四");
        // 创建Multiset
        Multiset<String> nameMultiset = HashMultiset.create();
        /*
           Multiset 接口中定义的方法
           add(E element) :向其中添加单个元素
           add(E element,int occurrences) : 向其中添加指定个数的元素
           count(Object element) : 返回给定参数元素的个数
           remove(E element) : 移除一个元素，其count值 会响应减少
           remove(E element,int occurrences): 移除相应个数的元素
           elementSet() : 将不同的元素放入一个Set中
           entrySet(): 类似与Map.entrySet 返回Set<Multiset.Entry>。包含的Entry支持使用getElement()和getCount()
           setCount(E element ,int count): 设定某一个元素的重复次数
           setCount(E element,int oldCount,int newCount): 将符合原有重复个数的元素修改为新的重复次数
           retainAll(Collection c) : 保留出现在给定集合参数的所有的元素
           removeAll(Collectionc) : 去除出现给给定集合参数的所有的元素
         */

        // 添加
        nameMultiset.addAll(words);
        String key1="张三";
        // 查询某个值的重复数
        int count = nameMultiset.count(key1);
        System.out.println(key1+"出现了 "+count+" 次");

        // 给李四设置固定的重复数
        String key2="李四";
        nameMultiset.setCount(key2, 10);
        int counted = nameMultiset.count(key2);
        System.out.println("设置 "+key2+" 固定次数 "+counted); //10
    }
}